home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / samples / statistic.c < prev   
C/C++ Source or Header  |  1995-11-07  |  9KB  |  358 lines

  1. /*
  2.  * statistic.c - print ether+ statistics
  3.  *
  4.  * Copyright (C) 1994 Tomoaki Tada/F.C.T.
  5.  */
  6.  
  7. static char *rcsid = "$Id: statistic.c,v 1.3 1994/08/04 05:11:26 Niggle Exp Niggle $";
  8.  
  9. /*
  10.  * $Log: statistic.c,v $
  11.  * Revision 1.3  1994/08/04  05:11:26  Niggle
  12.  * deviceé¬æ╢ì▌é╡é╚éóÅΩìçé╠ò\Īé≡ò╧ìX
  13.  *
  14.  * Revision 1.2  1994/07/23  01:01:50  Niggle
  15.  * òíÉöé╠EtherDriveré╔æ╬ë₧
  16.  *
  17.  * Revision 1.1  1994/06/22  02:01:37  Niggle
  18.  * Initial revision
  19.  *
  20.  */
  21.  
  22. #include<stdio.h>
  23. #include<stdlib.h>
  24. #include<string.h>
  25. #include<sys/scsi.h>
  26.  
  27. #include"etherdrv.h"
  28.  
  29. struct sts
  30. {
  31.   char *name;
  32.   int size;
  33.   int offset;
  34. };
  35.  
  36. #define NUM_OF_SS (32)
  37. #define SS_TOP (98)
  38. struct sts SCSI_STAT[NUM_OF_SS] =
  39. {
  40.   {"    scsi_int", 4, SS_TOP},
  41.   {"      select", 4, SS_TOP + 4},
  42.   {"       reset", 4, SS_TOP + 8},
  43.   {" cmmd_ethwrt", 4, SS_TOP + 12},
  44.   {"    bus_busy", 4, SS_TOP + 16},
  45.   {"   arbitrate", 4, SS_TOP + 20},
  46.   {"  reconnects", 4, SS_TOP + 24},
  47.   {"  recon_rcvs", 4, SS_TOP + 36},
  48.   {" recon_sends", 4, SS_TOP + 40},
  49.   {"  discon_pre", 4, SS_TOP + 28},
  50.   {" discon_post", 4, SS_TOP + 32},
  51.   {"  discon_sel", 2, SS_TOP + 82},
  52.   {"  no_busfree", 2, 186 + 2 * 12},
  53.   {"    lost_arb", 2, SS_TOP + 84},
  54.   {" toss_packet", 4, SS_TOP + 44},
  55.   {"    recon_ok", 2, SS_TOP + 48},
  56.  
  57.   {" cmmd_ethrst", 2, SS_TOP + 54},
  58.   {" cmmd_sndmsg", 2, SS_TOP + 56},
  59.   {" cmmd_getmsg", 2, SS_TOP + 58},
  60.   {"    cmmd_inq", 2, SS_TOP + 60},
  61.   {" cmmd_rqsens", 2, SS_TOP + 62},
  62.   {" cmmd_tstrdy", 2, SS_TOP + 64},
  63.   {" cmmd_mdsens", 2, SS_TOP + 66},
  64.   {"  cmmd_dummy", 2, SS_TOP + 68},
  65.   {"  cmmd_rdiag", 2, SS_TOP + 74},
  66.   {"  cmmd_sdiag", 2, SS_TOP + 76},
  67.   {"   cmmd_addr", 2, SS_TOP + 70},
  68.   {"  cmmd_mcast", 2, SS_TOP + 72},
  69.   {"    mess_out", 2, SS_TOP + 52},
  70.   {"  gotbus_rst", 2, SS_TOP + 78},
  71.   {"      set_up", 2, SS_TOP + 50},
  72.   {"  setbus_rst", 2, SS_TOP + 80},
  73. };
  74.  
  75. #define NUM_OF_SE (28)
  76. #define SE_TOP (186)
  77. struct sts SCSI_ERROR[NUM_OF_SE] =
  78. {
  79.   {"      parity", 2, SE_TOP},
  80.   {"multiple_ids", 2, SE_TOP + 2},
  81.   {"   cmmd_err1", 2, SE_TOP + 2 * 2},
  82.   {" cmmd_unknwn", 2, SE_TOP + 2 * 3},
  83.   {"   cmmd_err2", 2, SE_TOP + 2 * 4},
  84.   {"    cdms_to1", 2, SE_TOP + 2 * 5},
  85.   {"    cdms_to2", 2, SE_TOP + 2 * 6},
  86.   {"    cdms_to3", 2, SE_TOP + 2 * 7},
  87.   {"  status_err", 2, SE_TOP + 2 * 8},
  88.   {"    stms_to1", 2, SE_TOP + 2 * 9},
  89.   {"    stms_to2", 2, SE_TOP + 2 * 10},
  90.   {"    stms_to3", 2, SE_TOP + 2 * 11},
  91.   {" no_initresp", 2, SE_TOP + 2 * 13},
  92.   {"   mssg_pre1", 2, SE_TOP + 2 * 14},
  93.   {"   mssg_pre2", 2, SE_TOP + 2 * 15},
  94.   {"unkwnmsg_pre", 2, SE_TOP + 2 * 16},
  95.   {"  mssg_post1", 2, SE_TOP + 2 * 17},
  96.   {"  mssg_post2", 2, SE_TOP + 2 * 18},
  97.   {"unkwnmsg_pst", 2, SE_TOP + 2 * 19},
  98.   {" xmit_badlen", 2, SE_TOP + 2 * 20},
  99.   {"  Out_DMAto1", 2, SE_TOP + 2 * 21},
  100.   {"  Out_DMAto2", 2, SE_TOP + 2 * 22},
  101.   {"  Out_DMAto3", 2, SE_TOP + 2 * 23},
  102.   {"   In_DMAto1", 2, SE_TOP + 2 * 24},
  103.   {"   In_DMAto2", 2, SE_TOP + 2 * 25},
  104.   {"   no_maccon", 2, SE_TOP + 2 * 26},
  105.   {"   ether_out", 2, SE_TOP + 2 * 27},
  106.   {" mssg_finish", 2, SE_TOP + 2 * 28},
  107. };
  108.  
  109. #define NUM_OF_NS (4)
  110. #define NS_TOP (246)
  111. struct sts NET_STAT[NUM_OF_NS] =
  112. {
  113.   {"    Receives", 4, NS_TOP},
  114.   {"   Transmits", 4, NS_TOP + 4},
  115.   {"Transmit req", 4, NS_TOP + 8},
  116.   {"      Resets", 2, NS_TOP + 12},
  117. };
  118.  
  119. #define NUM_OF_NE (15)
  120. #define NE_TOP (244 + 16 + 2)
  121. struct sts NET_ERROR[NUM_OF_NE] =
  122. {
  123.   {"   CRC Error", 2, NE_TOP + 2 * 8},
  124.   {" Frame Error", 2, NE_TOP + 2 * 7},
  125.   {"Missed Pckts", 2, NE_TOP + 2 * 9},
  126.   {"   unexp_rst", 2, NE_TOP},
  127.   {"      re_int", 2, NE_TOP + 2 * 2},
  128.   {"      te_int", 2, NE_TOP + 2 * 3},
  129.   {"      ow_int", 2, NE_TOP + 2 * 4},
  130.   {"cntovflw_int", 2, NE_TOP + 2 * 5},
  131.   {"     dma_int", 2, NE_TOP + 2 * 6},
  132.   {"     txto_in", 2, NE_TOP + 2 * 10},
  133.   {"    txto_wrt", 2, NE_TOP + 2 * 11},
  134.   {"  txon_ovflw", 2, NE_TOP + 2 * 13},
  135.   {"  txin_ovflw", 2, NE_TOP + 2 * 14},
  136.   {" txwrt_ovflw", 2, NE_TOP + 2 * 15},
  137.   {"Transmit Err", 2, NE_TOP + 2},
  138. };
  139.  
  140. unsigned char inq_buff[292];
  141. int wrapping;
  142.  
  143. unsigned short get16 (unsigned char *);
  144. unsigned long get32 (unsigned char *);
  145. int search_ether_plus (char *name);
  146. void print_scsi_stat (void);
  147. void print_scsi_err (void);
  148. void print_net_stat (void);
  149. void print_net_err (void);
  150.  
  151. /************************************************
  152.  *                        *
  153.  ************************************************/
  154. int
  155. main (int argc, char **argv)
  156. {
  157.   int all, s, se, n, ne;
  158.  
  159.   all = s = se = n = ne = 0;
  160.   if (argc > 1)
  161.     {
  162.       int c;
  163.       while ((c = getopt (argc, argv, "sSeE")) != EOF)
  164.     {
  165.       switch (c)
  166.         {
  167.         case 's':
  168.           n = 1;
  169.           break;
  170.         case 'S':
  171.           s = 1;
  172.           break;
  173.         case 'e':
  174.           ne = 1;
  175.           break;
  176.         case 'E':
  177.           se = 1;
  178.           break;
  179.         default:
  180.           break;
  181.         }
  182.     }
  183.       if (se + s + ne + n == 0)
  184.     all = 1;
  185.       if (optind < argc)
  186.     {
  187.       if (search_ether_plus (argv[optind]))
  188.         {
  189.           if (n || all)
  190.         print_net_stat ();
  191.           if (ne || all)
  192.         print_net_err ();
  193.           if (s || all)
  194.         print_scsi_stat ();
  195.           if (se || all)
  196.         print_scsi_err ();
  197.           return 0;
  198.         }
  199.       else
  200.         printf ("statistic: No such device %s\n", argv[optind]);
  201.     }
  202.       else
  203.     printf ("usage: statistic [-sSeE] device-name\n");
  204.     }
  205.   else
  206.     printf ("usage: statistic [-sSeE] device-name\n");
  207.  
  208.   return 0;
  209. }
  210.  
  211. /************************************************
  212.  *                        *
  213.  ************************************************/
  214. static unsigned short
  215. get16 (unsigned char *src)
  216. {
  217.   return (*src) + (*(src + 1) << 8);
  218. }
  219.  
  220. /************************************************
  221.  *                        *
  222.  ************************************************/
  223. static unsigned long
  224. get32 (unsigned char *src)
  225. {
  226.   return (*src) + (*(src + 1) << 8) + (*(src + 2) << 16) + (*(src + 3) << 24);
  227. }
  228.  
  229. /************************************************
  230.  *                        *
  231.  ************************************************/
  232. int
  233. search_ether_plus (char *dev)
  234. {
  235.   int ino;
  236.   char name[16];
  237.  
  238.   if (!strchr (dev, '/'))
  239.     {
  240.       strcpy (name, "/dev/");
  241.       strcat (name, dev);
  242.     }
  243.   else
  244.     strcpy (name, dev);
  245.  
  246.   if (ETDGetDriverVersion (name, &ino) < 0)
  247.     return 0;
  248.  
  249.   if (!ETDGetStatistics (inq_buff, ino))
  250.     return 1;
  251.  
  252.   return 0;
  253. }
  254.  
  255. /************************************************
  256.  *                        *
  257.  ************************************************/
  258. void
  259. print_net_stat (void)
  260. {
  261.   int i;
  262.  
  263.   if (wrapping)
  264.     printf ("\n");
  265.   wrapping = 1;
  266.   printf ("Ether+ Network Statistics\n");
  267.   for ( i = 0; i < (NUM_OF_NS + 1) / 2; i++)
  268.     {
  269.       struct sts *right, *left;
  270.       char *offset_l, *offset_r;
  271.  
  272.       left = &NET_STAT[i]; right = &NET_STAT[i + NUM_OF_NS / 2];
  273.       offset_l = inq_buff + left->offset; offset_r = inq_buff + right->offset;
  274.       printf ("\t%s    %8d    %s    %8d\n",
  275.           left->name, ((left->size == 4) ? get32 (offset_l) : get16 (offset_l)),
  276.           right->name, ((right->size == 4) ? get32 (offset_r) : get16 (offset_r)));
  277.     }
  278.   return;
  279. }
  280.  
  281. /************************************************
  282.  *                        *
  283.  ************************************************/
  284. void
  285. print_net_err (void)
  286. {
  287.   int i;
  288.  
  289.   if (wrapping)
  290.     printf ("\n");
  291.   wrapping = 1;
  292.   printf ("Ether+ Network Errors\n");
  293.   for ( i = 0; i < (NUM_OF_NE + 1) / 2; i++)
  294.     {
  295.       struct sts *right, *left;
  296.       char *offset_l, *offset_r;
  297.  
  298.       left = &NET_ERROR[i]; right = &NET_ERROR[i + NUM_OF_NE / 2];
  299.       offset_l = inq_buff + left->offset; offset_r = inq_buff + right->offset;
  300.       printf ("\t%s    %8d    %s    %8d\n",
  301.           left->name, ((left->size == 4) ? get32 (offset_l) : get16 (offset_l)),
  302.           right->name, ((right->size == 4) ? get32 (offset_r) : get16 (offset_r)));
  303.     }
  304.   return;
  305. }
  306.  
  307. /************************************************
  308.  *                        *
  309.  ************************************************/
  310. void
  311. print_scsi_stat (void)
  312. {
  313.   int i;
  314.  
  315.   if (wrapping)
  316.     printf ("\n");
  317.   wrapping = 1;
  318.   printf ("Ether+ SCSI Statistics\n");
  319.   for ( i = 0; i < (NUM_OF_SS + 1) / 2; i++)
  320.     {
  321.       struct sts *right, *left;
  322.       char *offset_l, *offset_r;
  323.  
  324.       left = &SCSI_STAT[i]; right = &SCSI_STAT[i + NUM_OF_SS / 2];
  325.       offset_l = inq_buff + left->offset; offset_r = inq_buff + right->offset;
  326.       printf ("\t%s    %8d    %s    %8d\n",
  327.           left->name, ((left->size == 4) ? get32 (offset_l) : get16 (offset_l)),
  328.           right->name, ((right->size == 4) ? get32 (offset_r) : get16 (offset_r)));
  329.     }
  330.   return;
  331. }
  332.  
  333. /************************************************
  334.  *                        *
  335.  ************************************************/
  336. void
  337. print_scsi_err (void)
  338. {
  339.   int i;
  340.  
  341.   if (wrapping)
  342.     printf ("\n");
  343.   wrapping = 1;
  344.   printf ("Ether+ SCSI Errors\n");
  345.   for ( i = 0; i < (NUM_OF_SE + 1) / 2; i++)
  346.     {
  347.       struct sts *right, *left;
  348.       char *offset_l, *offset_r;
  349.  
  350.       left = &SCSI_ERROR[i]; right = &SCSI_ERROR[i + NUM_OF_SE / 2];
  351.       offset_l = inq_buff + left->offset; offset_r = inq_buff + right->offset;
  352.       printf ("\t%s    %8d    %s    %8d\n",
  353.           left->name, ((left->size == 4) ? get32 (offset_l) : get16 (offset_l)),
  354.           right->name, ((right->size == 4) ? get32 (offset_r) : get16 (offset_r)));
  355.     }
  356.   return;
  357. }
  358.